<?php
namespace app\service;
use think\facade\Log;
use think\facade\Cache;
use app\model\Applets;
use app\model\TempUsers;

class TokenService{
	private static $redisKey='mp:token:';
	//创建token
	public static function createToken($id){
		$paramArr=[];
		$length=mt_rand(10,20);
		for ($i=0; $i <$length ; $i++) { 
			$paramArr[]=mt_rand(1,200);
		}
		//生成参数的索引
		$paramsIndex=mt_rand(1,$length);
		if(count($paramArr)<$paramsIndex){
			$paramsIndex=$paramsIndex-1;
		}
		$paramArr[$paramsIndex]=$id;
		$paramArr[]=$paramsIndex;

		$str=[
			paramEncrypt(implode(',',$paramArr)),//加密的用户id
			paramEncrypt(getRandStr(32)),//随机字符串
			time()//时间戳
		];
		$token = implode('_',$str);
		$token=base64_encode($token);
		return $token;
	}

	//解析token
	public static function parsedToken($token){
		if(!isBase64($token)){
			return false;
		}
		$token=base64_decode($token);

		$decryptToken=explode('_',$token);

		$result=paramDecrypt($decryptToken[0]);
		if(!$result){
			return false;
		}

		$keyArray=explode(',',$result);
		// dump($keyArray);
		//获取真正的参数索引
		$keyArrayIndex=$keyArray[count($keyArray)-1];

		$id=$keyArray[$keyArrayIndex];
		$idArr=explode('_',$id);
		return ['id'=>$id,'length'=>count($idArr)];
	}

	//获取token
	public static function getToken($token){
		$result=null;
		// Cache::store('redis')->set('mp:token:'.$token, NULL);
		$parsedTokenResult=self::parsedToken($token);
		if($parsedTokenResult["length"]==1){
			//判断用户是不是存在
			//登录的用户
			$res=Applets::getId($parsedTokenResult['id']);
			//获取新的用户
			// $result=Applets::getTempUsers();
		}else if($parsedTokenResult["length"]==2){
			//判断用户是不是存在
			//没有登录的用户
			$res=TempUsers::getId($parsedTokenResult['id']);
			//获取新的用户
			$result=TempUsers::getTempUsers();
		}
		if(!$res){
			return false;
		}
		if(!$result){
			return false;
		}

		//创建token
		$newToken=self::createToken($result->id);
		self::saveToken($newToken,$result);

		//把已使用的用户，更新为未使用中
		TempUsers::updateTempUsersStatus($res->id,0);

		return $newToken;
	}

	//保存token
	public static function saveToken($token,$data=''){
		// 用户信息存到缓存中
		// 设置缓存, 7200 ,120分钟后过期
		// 设置缓存, 3600 ,60分钟后过期
		// 设置缓存, 300 ,5分钟后过期
		$result = Cache::store('redis')->set(self::$redisKey.$token , json_encode($data) , 3600);// 设置缓存
        if(!$result){
            return false;
        }
        return true;
	}
	//效验token
	public static function verifyToken($token){
		$result = Cache::store('redis')->get(self::$redisKey.$token);
        if(!$result){
            return false;
        }
        return true;
	}










}
